First query, executed at: 2018-07-01

The first query is:

In this plot, the ‘AND’ operator is visualised by a solid line, while the ‘OR’ operator is visualised by a dotted line.

In this query, the searched terms must occur in entries’ title fields.

In the interface language of the PubMed interface to the PubMed database and the Ebscohost and Ovid interfaces to a variety of databases such as PsycINFO, PsycArticles, and MedLine, this query renders as:

 PUBMED QUERY:
(((cognitive behavio* therapy [TI]) OR (cbt [TI]) OR (exposure [TI])) AND ((child* [TI]) OR (adolescent* [TI]) OR (youth [TI])) AND ((anxiety [TI]) OR (fear [TI])))

 EBSCOHOST QUERY:
TI (("cognitive behavio* therapy" OR "cbt" OR "exposure") AND ("child*" OR "adolescent*" OR "youth") AND ("anxiety" OR "fear"))

 OVID QUERY:
((("cognitive behavio* therapy" OR "cbt" OR "exposure") AND ("child*" OR "adolescent*" OR "youth") AND ("anxiety" OR "fear"))).ti.

NOTE: export the results as .RIS files, called 'MEDLINE' in PubMed.

This query was run at 2018-07-01 in PubMed (XXXX hits) and PsycINFO accessed through EbscoHost (XXXX hits), and exported to RIS format (called ‘medline’ in PubMed). The RIS files were then imported in R using metabefor.

### Import PsycINFO hits
firstQueryIteration_psycinfo <-
  importRISlike(file.path(queryHitExportPath,
                          "psycinfo-XXXX-XX-XX.ris"),
                encoding="native.enc");

### Import PubMed hits
firstQueryIteration_pubmed <-
  importRISlike(file.path(queryHitExportPath,
                          "pubmed-XXXX-XX-XX.ris"));

### Merge the two sets of hits
firstQueryIteration <-
  findDuplicateReferences(primaryRefs = firstQueryIteration_psycinfo,
                          secondaryRefs = firstQueryIteration_pubmed,
                          duplicateFieldValue = "dupl",
                          newRecordValue = "PubMed",
                          duplicateValue = "duplicate (both PsycINFO and PubMed)",
                          originalValue = "PsycINFO");

### Generate bibtex keys
firstQueryIteration$output$records <-
  generateBibtexkeys(firstQueryIteration$output$records);

### Add query date identifier to bibtex keys
firstQueryIteration$output$records$bibtexkey <-
  paste0(firstQueryIteration$output$records$bibtexkey,
         "-20180514");

### Export the hits to bibtex for screening in JabRef
sysrevExport(firstQueryIteration,
             filename=file.path(screeningPath,
                                "2018-05-14-screening.bib"),
             screeningType="screening");

The merged list of query hits has now been exported to file 2018-05-14-screening.bib in directory “screening” and can be opened using JabRef, which can be downloaded from https://www.fosshub.com/JabRef.html.

JabRef configuration

When opening a bibliographic library (i.e. a file with the extension .bib) in JabRef, it will show the entry table, which is a convenient way to inspect all entries (hits, references, articles, etc) in the library. To prepare JabRef for screening, two settings are important.

First, to change the fields that are visible in the overview table of all references (i.e. the entry table), open the ‘Options’ drop-down menu and select ‘Preferences’. In the preferences dialog, open the ‘Entry table columns’ section:

Figure 1: Screenshot of JabRef preferences dialog when the Entry table columns section is opened.

Figure 1: Screenshot of JabRef preferences dialog when the ‘Entry table columns’ section is opened.

There, the columns shown in the entry table can be edited in the ‘Entry table columns’ sections. A bit confusingly, this is done by adding rows in the table shown in this dialog. Each ‘row’ in this table represents a column in the entry table.

Note that in bibtex (and therefore JabRef), you can create new fields on the fly. In this case, use field ‘screening1’ for screening the hits of this first screening iteration: simply add this field name as a ‘row’ (column) in the entry table. This will show, for every entry, the contents of that field (if it has any).

Second, you need to be able to edit the content in that field. The entry table is very convenient to maintain an overview of the entries in the database, but cannot be used for editing. To edit an entry, double click it in the entry tabel. This opens the entry editor, which has a number of tabs. Each tab shows a number of fields which can then be edited.

These tabs can be configured by setting the ‘General fields’. Open the ‘Options’ drop-down menu and select ‘General Fields’ to configure which fields are available in the different tabs when opening an entry.

Figure 2: Screenshot of JabRef dialog used to set the general fields.

Figure 2: Screenshot of JabRef dialog used to set the general fields.

Add a dedicated field for the reviewing, showing only the title, abstract, and screening1 fields. This allows you to focus on the relevant information while ignoring irrelevant and potentially biasing information (such as year, journal, and authors). Each row in this text area shows one tab. The first term on each row is the tab’s name, followed by a colon (:) and then the fields shown in the tab, separated by semicolons (;). For example, you could add the following row:

Screening Round 1:title;abstract;screening1

Screening process

For every entry, add the following text in the ‘screening’ field:

So once JabRef is opened, when screening, make sure that the ‘screening1’ field is shown in the entry table (i.e. that it is one of the entry table columns), and create one entry editing tab using ‘General Fields’ that contains the fields title, abstract, and screening1. You can then use this tab for the screening. It is also convenient to show field dupl in either the entry table or the screening tab in the entry editor, because for duplicate records (that were identified as such - the algorithm may miss some duplicates of course), that field contains the text dupl.

Make sure to save the database with query hits under a different name than “2018-05-14-screening.bib”. That is important because file “2018-05-14-screening.bib” will get overwritten if this R Markdown file is executed again.

Second query, executed at: 2018-05-23

The query was updated to:

NEWQUERY

This was run at 2018-05-23 in PubMed (61 hits) and PsycINFO accessed through EbscoHost (72 hits), and exported to the RIS format (called ‘medline’ in PubMed). The RIS files were then imported in R using metabefor.

### Import PsycINFO hits
secondQueryIteration_psycinfo <-
  importRISlike(file.path(queryHitExportPath,
                          "psycinfo-2018-05-23.ris"),
                encoding="native.enc");

### Import PubMed hits
secondQueryIteration_pubmed <-
  importRISlike(file.path(queryHitExportPath,
                          "pubmed-2018-05-23.ris"));

### Merge the two sets of hits
secondQueryIteration <-
  findDuplicateReferences(primaryRefs = secondQueryIteration_psycinfo,
                          secondaryRefs = secondQueryIteration_pubmed,
                          duplicateFieldValue = "dupl (2nd)",
                          newRecordValue = "PubMed (2nd)",
                          duplicateValue = "duplicate (both PsycINFO and PubMed; 2nd)",
                          originalValue = "PsycINFO (2nd)");

### Generate bibtex keys
secondQueryIteration$output$records <-
  generateBibtexkeys(secondQueryIteration$output$records);

### Add query date identifier to bibtex keys
secondQueryIteration$output$records$bibtexkey <-
  paste0(secondQueryIteration$output$records$bibtexkey,
         "-20180523");

### Import results from first query (these have been screened now)
firstQueryIteration_screened <-
  importBibtex(file.path(screeningPath,
                         "2018-05-14-screening#1.bib"));

### Merge the screened reference database from the first query
### with the database from the second query
secondQueryIteration_merged <-
  findDuplicateReferences(primaryRefs = firstQueryIteration_screened,
                          secondaryRefs = secondQueryIteration,
                          duplicateFieldValue = "Screened in first iteration",
                          newRecordValue = "From second query",
                          duplicateValue = "From first query (screened in first iteration)",
                          originalValue = "screening1");

### The new records are stored in secondQueryIteration_merged$output$newRecords, so we
### can copy these to the database from the first screening. We also store the entire
### database so that we can document the process (and if need be, check whether anything
### went wrong).

secondScreening <- firstQueryIteration_screened;

secondScreening$output$records <- rbind.fill(secondScreening$output$records,
                                             secondQueryIteration_merged$output$newRecords);

### Export the hits to bibtex for screening in JabRef
sysrevExport(secondQueryIteration_merged,
             filename=file.path(screeningPath,
                                "2018-05-23-fully-merged-database.bib"),
             screeningType="screening");

sysrevExport(secondScreening,
             filename=file.path(screeningPath,
                                "2018-05-23-screening.bib"),
             screeningType="screening");

The merged bibliographic database has been stored in the screening path (B:/Data/research/habituation-versus-inhibition-in-exposure-therapy/screening), to file 2018-05-23-screening.bib. This file can now be opened in JabRef, and should be saved to a different filename before any edits are made (because, after all, the file named 2018-05-23-screening.bib will be overwritten every time this script runs).

In this merged database, field ‘screening1’ has been preserved. Records where this field is empty, therefore, are from the second query, and should be screened in the second screening sweep.

Generation of the Extraction Script

We will use a metabefor extraction script for the extraction of the data. The idea of this script is to extract the data from the original sources with a minimum of interpretation. The data is extracted into a machine-readable format, which then allows competely transparent further processing and synthesis.

These scripts are generated on the basis of two tables/spreadsheets. The first contains the entities to extract, such as study year, sample size, how variables were operationalised, and associations that were found. The second contains the valid values for each entity, to allow efficiently providing coders with examples, instructions, and to allow easy verification of the input.

Sheet-identifying info appears to be a browser URL.
googlesheets will attempt to extract sheet key from the URL.
Putative key: 1TpdpB926luKVy2tCwBusFkxZ7xv-BzdzzBjmOU26PI8
Worksheets feed constructed with public visibility
Accessing worksheet titled 'entities'.
Parsed with column specification:
cols(
  title = col_character(),
  description = col_character(),
  identifier = col_character(),
  valueTemplate = col_character(),
  validValues = col_character(),
  default = col_integer(),
  examples = col_character(),
  parent = col_character(),
  entityRef = col_character(),
  fieldRef = col_character(),
  owner = col_character(),
  list = col_logical(),
  collapsing = col_character(),
  repeating = col_logical(),
  recurring = col_character(),
  recursing = col_character()
)
Accessing worksheet titled 'valueTemplates'.
Parsed with column specification:
cols(
  identifier = col_character(),
  description = col_character(),
  validValues = col_character(),
  default = col_character(),
  examples = col_character(),
  validation = col_character(),
  error = col_character()
)
Accessing worksheet titled 'definitions'.
Parsed with column specification:
cols(
  Term = col_character(),
  Definition = col_character()
)
Successfully read the extraction script specifications from Google sheets.
Stored local backup of entities to 'B:/Data/research/habituation-versus-inhibition-in-exposure-therapy/extraction/entities-local-copy.csv'.
Stored local backup of value templates to 'B:/Data/research/habituation-versus-inhibition-in-exposure-therapy/extraction/valueTemplates-local-copy.csv'.
Parsed extraction script specifications into extraction script template.
Successfully wrote extraction script template to 'B:/Data/research/habituation-versus-inhibition-in-exposure-therapy/extraction/extractionScriptTemplate.rxs.Rmd'.